#include "vector4.h"

//Funciones de la clase

/*
Vector4::Vector4()
{
}

Vector4::Vector4(const REAL ax,const REAL ay):x(ax),y(ay),z(az),w(aw)
{
}

Vector4::Vector4(const Vector4 &v):x(v.m_x),y(v.m_y),z(v.m_z),w(v.m_w)
{
}

REAL Vector4::getX()const
{
  return m_x;
}

REAL Vector4::getY()const
{
  return m_y;
}

REAL Vector4::getZ()const
{
  return m_z;
}

REAL Vector4::getW()const
{
  return m_w;
}

void Vector4::set(const REAL ax,const REAL ay,const REAL az,const REAL aw)
{
  m_x=ax;
  m_y=ay;
  m_z=az;
  m_w=aw;
}

void Vector4::setX(const REAL ax)
{
  m_x=ax;
}

void Vector4::setY(const REAL ay)
{
  m_y=ay;
}

void Vector4::setZ(const REAL az)
{
  m_z=az;
}

void Vector4::setW(const REAL aw)
{
  m_w=aw;
}

REAL Vector4::getModule()const
{
  return sqrt(m_x*m_x+m_y*m_y+m_z*m_z+m_w*m_w);
}

void Vector4::setModule(const REAL m)
{
  Vector4 aux=*this;
  m_x=m*(aux.m_x/aux.module());
  m_y=m*(aux.m_y/aux.module());
  m_z=m*(aux.m_z/aux.module());
  m_w=m*(aux.m_w/aux.module());
}

Vector4 Vector4::operator+(const Vector4 &v)const
{
  return Vector4(m_x+v.m_x,m_y+v.m_y,m_z+v.m_z,m_w+v.m_w);
}

Vector4 Vector4::operator-(const Vector4 &v)const
{
  return Vector4(m_x-v.m_x,m_y-v.m_y,m_z-v.m_z,m_w-v.m_w);
}

Vector4 Vector4::operator*(const REAL k)const
{
  return Vector4(m_x*k,m_y*k,m_z*k,m_w*k);
}

bool Vector4::operator==(const Vector4 &v)const
{
  return (m_x==v.m_x)&&(m_y==v.m_y)&&(m_z==v.m_z)&&(m_w==v.m_w);
}

bool Vector4::operator!=(const Vector4 &v)const
{
  return (m_x!=v.m_x)||(m_y!=v.m_y)||(m_z!=v.m_z)||(m_w!=v.m_w);
}

Vector4 Vector4::operator-()const
{
  return Vector4(-m_x,-m_y,-m_z,-m_w);
}

void Vector4::print()const
{
  printf("x: %f\ty: %f\tz: %f\tw: %f\n",m_x,m_y,m_z,m_w);
}


// Funciones externas a la clase
Vector4 add(const Vector4 &a,const Vector4 &b)
{
	return Vector4(a.getX()+b.getX(),a.getY()+b.getY(),a.getZ()+b.getZ(),a.getW()+b.getW());
}

Vector4 sub(const Vector4 &a,const Vector4 &b)
{
	return Vector4(a.getX()-b.getX(),a.getY()-b.getY(),a.getZ()-b.getZ(),a.getW()-b.getW());
}

REAL dotProduct(const Vector4 &a,const Vector4 &b)
{
	return a.getX()*b.getX()+a.getY()*b.getY()+a.getZ()*b.getZ()+a.getW()*b.getW();
}

Vector4 crossProduct(const Vector4 &a,const Vector4 &b,const Vector4 &c)
{
  REAL newX,newY,newZ,newW;
  newX = a.getY()*b.getZ()*c.getW()+a.getZ()*b.getW()*c.getY()+b.getY()*c.getZ()*a.getW()-a.getW()*c.getY()*b.getZ()-a.getY()*b.getW()*c.getZ()-a.getZ()*b.getY()*c.getW();
  newY = a.getX()*b.getZ()*c.getW()+a.getZ()*b.getW()*c.getX()+b.getX()*c.getZ()*a.getW()-a.getW()*c.getX()*b.getZ()-a.getX()*b.getW()*c.getZ()-a.getZ()*b.getX()*c.getW();
  newZ = a.getX()*b.getY()*c.getW()+a.getY()*b.getW()*c.getX()+b.getX()*c.getY()*a.getW()-a.getW()*c.getX()*b.getY()-a.getX()*b.getW()*c.getY()-a.getY()*b.getX()*c.getW();
  newW = a.getX()*b.getY()*c.getZ()+a.getY()*b.getZ()*c.getX()+b.getX()*c.getY()*a.getZ()-a.getZ()*c.getX()*b.getY()-a.getX()*b.getZ()*c.getY()-a.getY()*b.getX()*c.getZ();
  return Vector4(newX,newY,newZ,newW);
}

Vector4 multiply(const Vector4 &v,const REAL &k)
{
	return Vector4(v.getX()*k,v.getY()*k,v.getZ()*k,v.getW()*k);
}

Vector4 multiply(const REAL &k,const Vector4 &v)
{
	return multiply(v,k);
}

Vector4 normalize(const Vector4 &v)
{
	return Vector4(v.getX()/v.module(),v.getY()/v.module(),v.getZ()/v.module(),v.getW()/v.module());
}

Vector4 reverse(const Vector4 &v)
{
	return multiply(-1,v);
}
*/
